## 1 Добро пожаловать в мир конструирования ПО 2
### 1.1. Что такое конструирование ПО 2
### 1.2. Почему конструирование ПО так важно 5
### 1.3. Как читать эту книгу 6
## 2 Метафоры, позволяющие лучше понять разработку ПО 8
### 2.1. Важность метафор 8
### 2.2. Как использовать метафоры 10
### 2.3. Популярные метафоры, характеризующие разработку ПО 12

## 3 Семь раз отмерь, один раз отрежь: предварительные условия 21
### 3.1. Важность выполнения предварительных условий 22
### 3.2. Определите тип ПО, над которым вы работаете 28
### 3.3. Предварительные условия, связанные с определением проблемы 34
### 3.4. Предварительные условия, связанные с выработкой требований 36
### 3.5. Предварительные условия, связанные с разработкой архитектуры 41
### 3.6. Сколько времени следует посвятить выполнению предварительных условий 52

## 4 Основные решения, которые приходится принимать при конструировании 58
### 4.1. Выбор языка программирования 59
### 4.2. Конвенции программирования 63
### 4.3. Волны развития технологий 64
### 4.4. Выбор основных методик конструирования 66


## 5 Проектирование при конструировании 70
### 5.1. Проблемы, связанные с проектированием ПО 71
### 5.2. Основные концепции проектирования 74
### 5.3. Компоненты проектирования: эвристические принципы 84
### 5.4. Методики проектирования 107
### 5.5. Комментарии по поводу популярных методологий 115

## 6 Классы 121
### 6.1. Основы классов: абстрактные типы данных 122
### 6.2. Качественные интерфейсы классов 129
### 6.3. Вопросы проектирования и реализации 139
### 6.4. Разумные причины создания классов 148
### 6.5. Аспекты, специфические для языков 152
### 6.6. Следующий уровень: пакеты классов 153

## 7 Высококачественные методы 157
### 7.1. Разумные причины создания методов 160
### 7.2. Проектирование на уровне методов 163
### 7.3. Удачные имена методов 167
### 7.4. Насколько объемным может быть метод 169
### 7.5. Советы по использованию параметров методов 170
### 7.6. Отдельные соображения по использованию функций 177
### 7.7. Методы-макросы и встраиваемые методы 178

## 8 Защитное программирование 182
### 8.1. Защита программы от неправильных входных данных 183
### 8.2. Утверждения 184
### 8.3. Способы обработки ошибок 189
### 8.4. Исключения 193
### 8.5. Изоляция повреждений, вызванных ошибками 198
### 8.6. Отладочные средства 200
### 8.7. Доля защитного программирования в промышленной версии 204
### 8.8. Защита от защитного программирования 206

## 9 Процесс программирования с псевдокодом 209
### 9.1. Этапы создания классов и методов 210
### 9.2. Псевдокод для профи 211
### 9.3. Конструирование методов с использованием ППП 214
### 9.4. Альтернативы ППП 225

## 10 Общие принципы использования переменных 230
### 10.1. Что вы знаете о данных? 231
### 10.2. Грамотное объявление переменных 232
### 10.3. Принципы инициализации переменных 233
### 10.4. Область видимости 238
### 10.5. Персистентность 245
### 10.6. Время связывания 246
### 10.7. Связь между типами данных и управляющими структурами 247
### 10.8. Единственность цели каждой переменной 249

## 11 Сила имен переменных 252
### 11.1. Общие принципы выбора имен переменных 253
### 11.2. Именование конкретных типов данных 257
### 11.3. Сила конвенций именования 263
### 11.4. Неформальные конвенции именования 264
### 11.5. Стандартизованные префиксы 272
### 11.6. Грамотное сокращение имен переменных 274
### 11.7. Имена, которых следует избегать 277

## 12 Основные типы данных 282
### 12.1. Числа в общем 283
### 12.2. Целые числа 284
### 12.3. Числа с плавающей запятой 286
### 12.4. Символы и строки 289
### 12.5. Логические переменные 292
### 12.6. Перечислимые типы 294
### 12.7. Именованные константы 299
### 12.8. Массивы 301
### 12.9. Создание собственных типов данных (псевдонимы) 303

## 13 Нестандартные типы данных 310
### 13.1. Структуры 310
### 13.2. Указатели 314
### 13.3. Глобальные данные 326


## 14 Организация последовательного кода 338
### 14.1. Операторы, следующие в определенном порядке 338
### 14.2. Операторы, следующие в произвольном порядке 342
## 15 Условные операторы 346
### 15.1. Операторы if 346
### 15.2. Операторы case 353

## 16 Циклы 359
### 16.1. Выбор типа цикла 359
### 16.2. Управление циклом 365
### 16.3. Простое создание цикла — изнутри наружу 378
### 16.4. Соответствие между циклами и массивами 379

## 17 Нестандартные управляющие структуры 382
### 17.1. Множественные возвраты из метода 382
### 17.2. Рекурсия 385
### 17.3. Оператор goto 389
### 17.4. Перспективы нестандартных управляющих структур 401

## 18 Табличные методы 404
### 18.1. Основные вопросы применения табличных методов 405
### 18.2. Таблицы с прямым доступом 406
### 18.3. Таблицы с индексированным доступом 418
### 18.4. Таблицы со ступенчатым доступом 419
### 18.5. Другие примеры табличного поиска 422

## 19 Общие вопросы управления 424
### 19.1. Логические выражения 424
### 19.2. Составные операторы (блоки) 436
### 19.3. Пустые выражения 437
### 19.4. Укрощение опасно глубокой вложенности 438
### 19.5. Основа программирования: структурное программирование 448
### 19.6. Управляющие структуры и сложность 450


## 20 Качество ПО 456
### 20.1. Характеристики качества ПО 456
### 20.2. Методики повышения качества ПО 459
### 20.3. Относительная эффективность методик контроля качества ПО 462
### 20.4. Когда выполнять контроль качества ПО 466
### 20.5. Главный Закон Контроля Качества ПО 467
## 21 Совместное конструирование 471
### 21.1. Обзор методик совместной разработки ПО 472
### 21.2. Парное программирование 475
### 21.3. Формальные инспекции 477
### 21.4. Другие методики совместной разработки ПО 484
### 21.5. Сравнение методик совместного конструирования 487

## 22 Тестирование, выполняемое разработчиками 490
### 22.1. Тестирование, выполняемое разработчиками, и качество ПО 492
### 22.2. Рекомендуемый подход к тестированию, выполняемому разработчиками 494
### 22.3. Приемы тестирования 496
### 22.4. Типичные ошибки 507
### 22.5. Инструменты тестирования 513
### 22.6. Оптимизация процесса тестирования 518
### 22.7. Протоколы тестирования 520

## 23 Отладка 524
### 23.1. Общие вопросы отладки 524
### 23.2. Поиск дефекта 529
### 23.3. Устранение дефекта 539
### 23.4. Психологические аспекты отладки 543
### 23.5. Инструменты отладки — очевидные и не очень 545

## 24 Рефакторинг 551
### 24.1. Виды эволюции ПО 552
### 24.2. Введение в рефакторинг 553
### 24.3. Отдельные виды рефакторинга 559
### 24.4. Безопасный рефакторинг 566
### 24.5. Стратегии рефакторинга 568

## 25 Стратегии оптимизации кода 572
### 25.1. Общее обсуждение производительности ПО 573
### 25.2. Введение в оптимизацию кода 576
### 25.3. Где искать жир и патоку? 583
### 25.4. Оценка производительности 588
### 25.5. Итерация 590
### 25.6. Подход к оптимизации кода: резюме 591

## 26 Методики оптимизации кода 595
### 26.1. Логика 596
### 26.2. Циклы 602
### 26.3. Изменения типов данных 611
### 26.4. Выражения 616
### 26.5. Методы 625
### 26.6. Переписывание кода на низкоуровневом языке 626
### 26.7. Если что-то одно изменяется, что#то другое всегда остается постоянным 629

## 27 Как размер программы влияет на конструирование 634
### 27.1. Взаимодействие и размер 635
### 27.2. Диапазон размеров проектов 636
### 27.3. Влияние размера проекта на возникновение ошибок 636
### 27.4. Влияние размера проекта на производительность 638
### 27.5. Влияние размера проекта на процесс разработки 639

## 28 Управление конструированием 645
### 28.1. Поощрение хорошего кодирования 646
### 28.2. Управление конфигурацией 649
### 28.3. Оценка графика конструирования 655
### 28.4. Измерения 661
### 28.5. Гуманное отношение к программистам 664
### 28.6. Управление менеджером 670

## 29 Интеграция 673
### 29.1. Важность выбора подхода к интеграции 673
### 29.2. Частота интеграции — поэтапная или инкрементная 675
### 29.3. Стратегии инкрементной интеграции 678
### 29.4. Ежедневная сборка и дымовые тесты 686

## 30 Инструменты программирования 694
### 30.1. Инструменты для проектирования 695
### 30.2. Инструменты для работы с исходным кодом 695
### 30.3. Инструменты для работы с исполняемым кодом 700
### 30.4. Инструменты и среды 704
### 30.5. Создание собственного программного инструментария 705
### 30.6. Волшебная страна инструментальных средств 707


## 31 Форматирование и стиль 712
### 31.1. Основные принципы форматирования 713
### 31.2. Способы форматирования 720
### 31.3. Стили форматирования 721

### 31.4. Форматирование управляющих структур 728
### 31.5. Форматирование отдельных операторов 736
### 31.6. Размещение комментариев 747
### 31.7. Размещение методов 750
### 31.8. Форматирование классов 752

## 32 Самодокументирующийся код 760
### 32.1. Внешняя документация 760
### 32.2. Стиль программирования как вид документации 761
### 32.3. Комментировать или не комментировать 764
### 32.4. Советы по эффективному комментированию 768
### 32.5. Методики комментирования 774
### 32.6. Стандарты IEEE 795

## 33 Личность 800
### 33.1. Причем тут характер 801
### 33.2. Интеллект и скромность 802
### 33.3. Любопытство 803
### 33.4. Профессиональная честность 806
### 33.5. Общение и сотрудничество 809
### 33.6. Творчество и дисциплина 809
### 33.7. Лень 810
### 33.8. Свойства, которые менее важны, чем кажется 811
### 33.9. Привычки 813

## 34 Основы мастерства 817
### 34.1. Боритесь со сложностью 817
### 34.2. Анализируйте процесс разработки 819
### 34.3. Пишите программы в первую очередь для людей и лишь во вторую —
для компьютеров 821
### 34.4. Программируйте с использованием языка, а не на языке 823
### 34.5. Концентрируйте внимание с помощью соглашений 824
### 34.6. Программируйте в терминах проблемной области 825
### 34.7. Опасайтесь падающих камней 827
### 34.8. Итерируйте, итерируйте и итерируйте 830
### 34.9. И да отделена будет религия от разработки ПО 831

## 35 Где искать дополнительную информацию 834
### 35.1. Информация о конструировании ПО 835
### 35.2. Не связанные с конструированием темы 836
### 35.3. Периодические издания 838
### 35.4. Список литературы для разработчика ПО 839
### 35.5. Профессиональные ассоциации 841
## Библиография 842
## Предметный указатель 863
## Об авторе 868